package com.ljx.offer;

import org.junit.Test;

/**
 * @author 李捷禧
 * Date: 2023/3/14
 * ClassName: C_15
 */

public class C_15 {
    /**
     * 方式一：
     * 使用的是n的二进制最后一位和1 做与运算，结果是1，res++
     * n等于右移一位后的n
     * >>>是无符号右移
     * >>是右移
     * @param n
     * @return
     */
    public int hammingWeight(int n) {
        int res = 0;
        while(n!=0){
          res += n & 1;
          n >>>=1;
        }
        return res;
    }

    /**
     * 方式二：
     *使用的是,遇到第一位是一的是后就循环一次，res++
     * n &= (n - 1);就是得到右边减少一个一的数
     * @param n
     * @return
     */
    public int hammingWeight2(int n) {
        int res = 0;
        while(n!=0){
            res++;
            n &= (n-1);
        }
        return res;
    }

    /**
     * 扩展第三种，目前第二种解法是最好的
     * 使用lowbit的方式，找出最后一个1
     * lowBit： n & (-n)。自行查询lowBit
     * @param n
     * @return
     */
    public int hammingWeight3(int n) {
        int res = 0;
        while(n!=0){
            res++;
            n -= (n & -n);
        }
        return res;
    }


    @Test
    public void test(){
        System.out.println(hammingWeight(-3));
    }
}
